package com.woohua.thread.optimize;

/***
 * @title Singleton
 * @description: 锁优化：
 *               1、使用无锁方案
 *               2、缩小锁的粒度：减少锁粒度一般用于容器类，例如通过map来缓存数据，每个key是一类数据，如证件类型、客户类型等等，
 *                  这样在对map操作时可以将锁分离到每个可以上，在操作某一类型的数据时，对key加锁。
 *                  Java 中的 ConcurrentHashMap 类内部分成了16个段，每段都有自己的锁，这样做大可以有16个并发操作，也是减少锁粒度，提高了效率。
 *               3、锁粗化：获取锁操作会消耗资源，如果一个操作需要频繁的获取锁，而获取锁操作之后的操作很快就能完成，那么可以将获取锁操作合并。
 *                  例如：在循环语句中获取同一个锁，可以将获取锁操作放在循环外。
 *                       for (int i = 0; i < size; i++) {
 *                          synchronized (lock) {
 *                              // do something
 *                          }
 *                       }
 *               4、减少锁的持有时间：只对有同步需要的代码做同步处理，而不一定对整个方法做同步，例如单例模式的二次检查
 *               5、锁分离
 *                  1）对于读多写少的数据，可以分离读写锁，读读不互斥，读写互斥，写写互斥，这样在读读时能提高效率
 *                  2）对于链表数据结构，如果取数据是从前端取数据，尾端存数据，那么可以将取数据和放数据的锁分离，参考 LinkedBlockingQueue
 *               6、避免死锁 : 死锁定位和如何解决
 * @author woo hua
 * @version 1.0.0
 * @create 2023/3/10 15:58
 **/
public class Singleton {

    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if(null == singleton) {
            // 减少锁持有时间，而不是把 synchronized 关键字放到方法上
            synchronized (Singleton.class) {
                if(null == singleton) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
